package com.uhomecp.lambda.stream5;

import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Java8Tester {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
        //生成流
        //在 Java 8 中, 集合接口有两个方法来生成流：
        //stream() − 为集合创建串行流。
        //parallelStream() − 为集合创建并行流。
        List<String> stringList = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        stringList.forEach(string-> System.out.println("strings.stream().filter(string -> !string.isEmpty())："+string));

        //Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数：
        Random random = new Random();
//        random.ints().limit(10).forEach(System.out::println);
        random.ints().limit(10).forEach(string-> System.out.println("10个随机数:"+string));

        //map 方法用于映射每个元素到对应的结果，以下代码片段使用 map 输出了元素对应的平方数：
        List<Integer> numbers = Arrays.asList(3, 2, 6, 4, 5, 2);
        //获取对应的平方数
        List<Integer> squaresList  = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
        squaresList.forEach(i-> System.out.println("对应平方数："+i));

        //filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串：
        List<String> stringList1 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
        // 获取空字符串的数量
        long count = stringList1.stream().filter(string -> string.isEmpty()).count();
        System.out.println("空字符串数量："+count);

        //limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据：
        random.ints().limit(10).forEach(i-> System.out.println("limit输出10条数据："+i));

        //sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序：
        random.ints().limit(10).sorted().forEach(i-> System.out.println("limit-10的sorted输出数据："+i));

        //parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量：
        long count1 = stringList1.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println("parallelStream空字符串数量:"+count1);

        //Collectors 类实现了很多归约操作，例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串：
        List<String> collect = stringList1.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        collect.forEach(string-> System.out.println("筛选列表Collectors:"+string));

        String joining = stringList1.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
        System.out.println("合并Collectors:"+joining);

        IntSummaryStatistics intSummaryStatistics = numbers.stream().mapToInt(x -> x).summaryStatistics();
        System.out.println("最大数:"+intSummaryStatistics.getMax());
        System.out.println("最小数:"+intSummaryStatistics.getMin());
        System.out.println("所有数之和:"+intSummaryStatistics.getSum());
        System.out.println("平均数:"+intSummaryStatistics.getAverage());

        oprObject();
    }

    public static void oprObject(){
        List<Student> stuList = new ArrayList<>();
        Student stu1 = new Student(1L,"李四",18);
        Student stu2 = new Student(2L,"张三",20);
        Student stu3 = new Student(3L,"王五",21);
        stuList.add(stu1);
        stuList.add(stu2);
        stuList.add(stu3);

        List<Long> collect = stuList.stream().map(student -> student.getStuId()).collect(Collectors.toList());
        collect.forEach(stuId-> System.out.println(stuId));
    }
}
